# Define your item pipelines here
#
# Don't forget to add your pipeline to the ITEM_PIPELINES setting
# See: https://docs.scrapy.org/en/latest/topics/item-pipeline.html


# useful for handling different item types with a single interface
from itemadapter import ItemAdapter

import pymysql
# 将数据保存在mongoDB中，需要进行安装pymongo 在终端执行指令：pip install pymongo
# 引入pymongo模块
import pymongo

# 将数据保存在本地csv文件中
class LuckyPipeline:
    # 读取每一行item都需要进行调用一次process_item方法，文件频繁打开，IO消耗资源较大
    # 问题解决：
    # 在数据写入前打开文件
    # 在数据接入后关闭文件
    # open_spider会在执行process_item之前进行调用
    def open_spider(self, spider):
        self.file=open("lucky.csv","a",encoding="UTF-8")
        pass
    # close_spider会在执行process_item之后进行调用
    def close_spider(self, spider):
        self.file.close()
        pass

    def process_item(self, item, spider):
        self.file.write(f"{item["qihao"]},{"_".join(item["red_ball"])},{item["blue_ball"]}\n")
        return item

#  将数据保存在MYSQL数据库中
class LuckyMySQLPipeline:
    # 创建数据库连接对象
    def open_spider(self, spider):
        self.conn=pymysql.connect(host="localhost",port=3306,user="root",password="123456",db="dz_python")
        pass
    # 关闭数据库连接
    def close_spider(self, spider):
        self.conn.close()
        pass

    def process_item(self, item, spider):
        #获取数据库游标
        cursor=self.conn.cursor()
        # 准备要执行的sql语句
        sql="INSERT INTO lucky(qihao,red_ball,blue_ball) VALUES(%s,%s,%s)"
        # 将红球的数据进行拼接，每个红球号码之间用，分隔
        redball=",".join(item["red_ball"])
        # 调用execute方法发送sql语句
        cursor.execute(sql,(item["qihao"],redball,item["blue_ball"]))
        # 事务提交
        self.conn.commit()
        return item

#  将数据保存在MYSQL数据库中
class LuckyMongoPipeline:
    # 创建数据库连接对象
    def open_spider(self, spider):
        # 创建mongoDB客户端，host表示要链接的IP地址 localhost 表示本机
        # port表示端口号，MongoDB的默认端口是27017
        self.conn=pymongo.MongoClient(host="localhost",port=27017)
        # 切换要使用的数据库 若该库存在，则直接使用，若不存在，则新建一个库，此处相当于use python02
        self.db=self.conn["python02"]
        # 指定要使用的集合 该集合若存在，则直接使用，若不存在，则新建一个
        self.collection=self.db["lucky"]
        pass
    # 关闭数据库连接
    def close_spider(self, spider):
        self.conn.close()
        pass

    def process_item(self, item, spider):
        # 将数据存储进MongoDB数据库
        self.collection.insert_one({"qihao":item["qihao"],"red_ball":item["red_ball"],"blue_ball":item["blue_ball"]})
        return item
